/**
 * 全局加载状态管理
 * 处理页面切换时的加载状态和请求计数
 */

import { ref } from 'vue'
import { defineStore } from 'pinia'

export const useLoadingStore = defineStore('loading', () => {
    // 是否显示页面切换加载
    const isPageLoading = ref(false)
    // 当前正在进行的请求数量
    const pendingRequests = ref(0)
    // 加载文本
    const loadingText = ref('正在加载页面...')

    /**
     * 开始页面加载
     * @param text 加载文本
     */
    const startPageLoading = (text: string = '正在加载页面...') => {
        loadingText.value = text
        isPageLoading.value = true
        // 注意：不在这里重置请求计数，让组件mounted后的请求能被正确计数
        // 请求计数会在组件卸载时自动清理
    }

    /**
     * 结束页面加载
     */
    const endPageLoading = () => {
        isPageLoading.value = false
        loadingText.value = '正在加载页面...'
    }

    /**
     * 增加请求计数
     */
    const addPendingRequest = () => {
        pendingRequests.value++
    }

    /**
     * 减少请求计数
     */
    const removePendingRequest = () => {
        if (pendingRequests.value > 0) {
            pendingRequests.value--
        }
    }

    /**
     * 检查是否所有请求都已完成
     */
    const isAllRequestsCompleted = () => {
        return pendingRequests.value === 0
    }

    /**
     * 重置请求计数
     */
    const resetPendingRequests = () => {
        pendingRequests.value = 0
    }

    /**
     * 等待所有请求完成
     * @param timeout 超时时间（毫秒）
     */
    const waitForAllRequests = (timeout: number = 10000): Promise<void> => {
        console.log('等待所有请求完成，当前请求数：', pendingRequests.value)
        return new Promise((resolve) => {
            const startTime = Date.now()
            const checkRequests = () => {
                const elapsed = Date.now() - startTime

                if (isAllRequestsCompleted()) {
                    console.log('所有请求完成')
                    resolve()
                } else if (elapsed > timeout) {
                    console.warn('等待请求超时，强制结束loading')
                    resolve()
                } else {
                    console.log('等待中，剩余请求数：', pendingRequests.value, '已等待：', elapsed + 'ms')
                    setTimeout(checkRequests, 50) // 缩短间隔，响应更快
                }
            }
            checkRequests()
        })
    }

    return {
        isPageLoading,
        pendingRequests,
        loadingText,
        startPageLoading,
        endPageLoading,
        addPendingRequest,
        removePendingRequest,
        isAllRequestsCompleted,
        resetPendingRequests,
        waitForAllRequests,
    }
})
